#include "doublelist.h"
#include "staffManage.h"


unsigned int current_staff_id=1;//登录用户ID
struct sockaddr_in serveraddr;
int sockfd;

dlist_t pthread_list;

void do_connect(){
	if(connect(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<0 )
	{
		perror("fail to connect");
		exit(1);
	}
}

void get_current_date(char date[])
{
	time_t t;
	struct tm *tp;
	time(&t);
	tp = localtime(&t);
	strftime(date, 32, "%Y-%m-%d %H:%M:%S", tp);
	return;
}

int do_login(int sockfd,MSG *msg)
{
	struct staff *infor=&msg->nstaff;
	msg->type=L;
	printf("I    D:   ");
	scanf("%d",&infor->id);
	printf("密  码:   ");
	scanf("%s",infor->password);
	send(sockfd,msg,sizeof(MSG),0);
	MSG rmsg={0};
	recv(sockfd,&rmsg,sizeof(MSG),0);

	current_staff_id=rmsg.send_id;
	
	//printf("登录返回++ type = %d,login id=%d \n",rmsg.type,current_staff_id);
	if(rmsg.type == 0)
	{
		return 0;//管理员
	}else if(rmsg.type == 1)
	{
		return 1;//普通用户
	}else{
		return -1;//登录失败
	}

}

//注册
void do_register(int sockfd,MSG *msg)
{
	struct staff *infor=&msg->nstaff;
	msg->type=R;

	printf("input name:  ");
	scanf("%s",infor->name);
	printf("input authority:  ");
	scanf("%d",&infor->authority);
	printf("input gender:  ");
	scanf("%s",&infor->gender);
	printf("input age:  ");
	scanf("%d",&infor->age);
	printf("input education:  ");
	scanf("%s",infor->education);
	printf("input salary:  ");
	scanf("%d",&infor->salary);
	printf("input password:  ");
	scanf("%s",infor->password);

	send(sockfd,msg,sizeof(MSG),0);
	MSG rmsg={0};
	recv(sockfd,&rmsg,sizeof(MSG),0);
	printf("go back register %d\n",rmsg.type);
	if(rmsg.type == 1){
		printf("注册成功！");
	}else{
		printf("注册失败！");
	}

}

int callback(void *arg, int f_num, char **f_value, char **f_name)
{
	return 0;
}

//查询单个员工
void select_sigle_staff(int sockfd,MSG *msg)
{ 
	msg->type = Q;
	msg->id=current_staff_id;
	send(sockfd, msg, sizeof(MSG), 0);

	recv(sockfd, msg, sizeof(MSG), 0);
	printf("%s\n",msg->msg);

	return;
}

//查询全部员工
void select_all_staff(int sockfd,MSG *msg)
{
	msg->type = A;
	send(sockfd, msg, sizeof(MSG), 0);
	int n = 0;

	MSG mymsg={0};
	recv(sockfd, &mymsg, sizeof(MSG), 0);
	
	printf("id    name    authority    gender    age    education    salary* \n");
	for(n = 0; n < mymsg.type; n++)
	{

		recv(sockfd, &mymsg, sizeof(MSG), 0);
#if 0
		printf("%4d   %4s     %4c        %4d    %4s        %4d \n",\
				mystaff.id,mystaff.name,mystaff.gender,mystaff.age,mystaff.education,mystaff.salary);
#endif
		printf("%s\n",mymsg.msg);
	}
	
	return;
}

void delete_staff(int sockfd,MSG*msg)
{
	msg->type = D;
	send(sockfd, msg, sizeof(MSG),0);
	printf("plese input staff id\n");
	scanf("%d",&msg->id);
	getchar();
	send(sockfd, msg, sizeof(MSG), 0);

	return;
}

void update_staff(int sockfd, MSG *msg)
{
	msg->type = UU;
	printf("please input password\n");
	msg->id=current_staff_id;
	scanf("%s",msg->msg);
	getchar();
	send(sockfd, msg, sizeof(MSG),0);
}

void update_root(int sockfd ,MSG *msg)
{
	int n=0;
	msg->type = U;
	printf("please input id\n");
	scanf("%d",&msg->id);
	printf("update NO: 1.name 2.age 3.salary 4.password \n");
	scanf("%d",&n);
	switch(n)
	{
	case 1:
		printf("input name:\n"); 
		scanf("%s", msg->msg);
		sprintf(msg->item,"%s","name");
		send(sockfd, msg, sizeof(MSG),0);
		break;
	case 2:
		printf("input age:\n"); 
		scanf("%s", msg->msg);
		sprintf(msg->item, "%s", "age");
		send(sockfd, msg, sizeof(MSG),0);
		break;
	case 3:
		printf("input salary:\n"); 
		scanf("%s", msg->msg);
		sprintf(msg->item, "%s", "salary");
		send(sockfd, msg, sizeof(MSG),0);
		break;
	case 4:
		printf("input password:\n");
		scanf("%s", msg->msg);
		sprintf(msg->item, "%s", "password");
		send(sockfd, msg, sizeof(MSG),0);
		break;
	
	}


}


//等待获取数据
void* pthread_recv(void *arg)
{
	int sockfd = *(int *)arg;
	MSG msg;

	while(1){
		sleep(2);
		recv(sockfd, &msg, sizeof(MSG), 0);
		printf("\n");
		printf("id_%d: %s\n",msg.send_id,msg.msg);
		printf("\n");
	}
	return NULL;
}

void* pthread_send(void*arg)
{
	int sockfd = *(int *)arg;
	pthread_list = create_doublelist();
	
	MSG msg;
	msg.type=SC;
	msg.receive_id=current_staff_id;
	strcpy(msg.msg,"请求数据");

	while(1)
	{
		send(sockfd, &msg, sizeof(MSG), 0);//发送单词到服务器端
		sleep(2);
	}
	return NULL;
}

void* pthread_get_all_staff(void*arg)
{
	MSG msg = *(MSG*)arg;
	select_all_staff(sockfd,&msg);
	return NULL;
}

//消息通信
int send_id_;
void do_chat(int sockfd,MSG *msg)
{
	pthread_t stid;
	if(pthread_create(&stid,NULL,pthread_get_all_staff,msg) != 0)
	{
		perror("fail to pthread_create");
		exit(1);
	}
	sleep(1);
	printf("请输入员工ID号：");
	scanf("%d",&send_id_);//读入消息
	putchar(10);

	pthread_t tid1,tid2;
	if(pthread_create(&tid1,NULL,pthread_recv,&sockfd) != 0)
	{
		perror("fail to pthread_create");
		exit(1);
	}
	if(pthread_create(&tid2,NULL,pthread_send,&sockfd) != 0)
	{
		perror("fail to pthread_create");
		exit(1);
	}
	
	MSG mymsg = *msg;
	mymsg.type = RC;
	mymsg.send_id=current_staff_id;
	mymsg.receive_id=send_id_;
	char currentDate[32];
	while(1)
	{
		printf("========:");
		scanf("%s",mymsg.msg);//读入消息

		if(strcmp(mymsg.msg,"#") == 0){
			pthread_cancel(tid1);
			pthread_cancel(tid2);
			break;
		}
		get_current_date(currentDate);
		strcpy(mymsg.send_time,currentDate);
		
		send(sockfd, &mymsg, sizeof(MSG), 0);//发送单词到服务器端
	}

}

void do_operation(int n){

	MSG msg;
	switch(n)
		{
		case 1:
			printf("\n");
			select_sigle_staff(sockfd,&msg);
			printf("\n");
			break;
		case 2:
			printf("\n");
			do_chat(sockfd,&msg);
			printf("\n");
			break;
		case 3:
			close(sockfd);
			exit(0);
		case 4:
			printf("\n");
			select_all_staff(sockfd,&msg);
			printf("\n");
			break;
		case 5:
			printf("\n");
			do_register(sockfd,&msg);
			printf("\n");
			break;
		case 6:
			printf("\n");
			delete_staff(sockfd,&msg);
			printf("\n");
			break;
		case 7:
			update_staff(sockfd,&msg);
			break;
		case 8:
			update_root(sockfd,&msg);
			break;
		}

}


int main(int argc, const char *argv[])
{
	MSG msg;

	if(argc < 3)
	{
		printf("请输入参数格式：%s <serv_ip> <serv_port>\n",argv[0]);
		exit(-1);
	}


	sockfd=socket(PF_INET,SOCK_STREAM,0);
	if(sockfd < 0)
	{
		perror("fail to socket");
		exit(1);
	}
	
	bzero(&serveraddr,sizeof(serveraddr));
	serveraddr.sin_family = PF_INET;
	serveraddr.sin_port = htons(atoi(argv[2]));
	serveraddr.sin_addr.s_addr=inet_addr(argv[1]);	
	
	do_connect();
	
	int n;
	while(1)
	{
		printf("***********************************\n");
		printf("1:登录   2：退出");
		printf("************************************\n");
		printf("请选择：");
		if (scanf("%d",&n) <= 0)
		{
			perror(" scanf fail");
			exit(-1);
		}

		switch(n)
		{
			case 1:
				printf("\n");
				int rest = do_login(sockfd,&msg);
				if(rest == 0)//管理员用户登录
				{
					printf("\n");
					goto manager;
				}else if(rest == 1){
					printf("\n");
					goto normal;
				}else{
					printf("用户名或密码错误！\n");	
				}
				break;
			case 2:
				close(sockfd);
				exit(0);

		}
	
	}

normal:
	while(1)
	{
		printf("***************************\n");
		printf("1.查询个人信息 2.聊天 3.退出 7.修改个人密码\n");
		printf("***************************\n");
		printf("请选择：");

		if(scanf("%d",&n) < 0)
		{
			perror("scanf");
			exit(-1);
		}
		do_operation(n);	
	}
	

manager:
	while(1)
	{
		printf("***************************\n");
		printf("4.查询全部员工信息 \n 5.注册员工 \n 6.删除员工 \
				\n 8.修改员工信息\n 3.退出 \n");
		printf("***************************\n");
		printf("请选择：");

		if(scanf("%d",&n) < 0)
		{
			perror("scanf");
			exit(-1);
		}
		do_operation(n);
	}	
	return 0;
}
